#  课堂
#  d1={'name':'zhang','age':20,'sex':'nan'}
#  print(d1.keys())
#  print(d1.values())
#
#  for i in d1.keys():
#      print(i)
#
#  for j in d1.values():
#      print(j)
#
#  for i,j in d1.items():
#      print(i,j)
# import random
#
#  dict_keys(['name', 'age', 'sex'])
#  dict_values(['zhang', 20, 'nan'])
#  name
#  age
#  sex
#  zhang
#  20
#  nan
#  name zhang
#  age 20
#  sex nan
#
#  课本
import math
import random
import string
import random
#
 # 1.求列表元素和
 # num = sum(range(0,10))
 # print(num)
 # 45
 #
 # 2.输出奇数索引元素
 # num = [2,5,8,1,5,8,9,3,6]
 # print(num[1::2])
 # [5, 1, 8, 3]
#
#  3.输出列表中奇数
#  num = [1,3,7,9,2,5,8,3,7,8,3,6,9,5]
#  for i in num:
#      if i%2==1:
#          print(i,end=',')
#  1,3,7,9,5,3,7,3,9,5,
#
#  4.将元素*2
#  print([i*2 for i in range(1,11)])
#  [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
#
#  5.键盘输入5个数判断是否是回文
#  num = list(input("请输入数"))
#  nums = list(reversed(num))
#  print(nums)
#  print(num)
#  for i in num:
#      for j in nums:
#          if i==j:
#              tag = 0
#          else:
#              tag =1
#  if tag:
#      print("不是回文")
#  else:
#      print("是回文")
#
#  请输入数12345
#  ['5', '4', '3', '2', '1']
#  ['1', '2', '3', '4', '5']
#  不是回文
#
#  ['1', '2', '3', '2', '1']
#  ['1', '2', '3', '2', '1']
#  是回文
#
# 6、生成一个包含20个整数的随机列表，对偶数索引进行降序排列，奇数索引的元素不变
# lst=random.choices(range(1,100),k=20)
# print("随机生成20个1~100的数字：\n",lst)
# list_one=lst[: : 2]
# list_tow=sorted(list_one,reverse=True)
# print(f"列表中偶数索引元素为{list_one}偶数降序排列为{list_tow}")

# 7、nums=[2,7,11,15,1,8],找到列表中任意相加等于9的元素集合如[(0,9),(4,5)]
# nums=[2,7,11,15,1,8]
# lst=[(i,j)for i in nums for j in nums if i+j==9]
# print("找到的组合为",lst)
#
#  序列编程题
#  1、编写程序，将用户输入的数字转换成相应的中文大写数字。例如，1.23转换为壹点贰叁。
# def f(num):
#  chinese = {0: '零',1: '壹',2: '贰',3: '叁',4: '肆',5: '伍',6: '陆',7: '柒',8: '捌',9: '玖' }
#  num_str = str(num)
#  int_chinese = ''
#  for i in num_str if '.' not in num_str else num_str.split('.')[0]:
#      int_chinese += chinese[int(i)]
#  decimal_chinese = ''
#  if '.' in num_str:
#      for i in num_str.split('.')[1]:
#          decimal_chinese += chinese[int(i)]
#  return '{}点{}'.format(int_chinese, decimal_chinese) if decimal_chinese else int_chinese
# input_num = float(input("请输入一个数字："))
# print(f(input_num))
# 请输入一个数字：100.918
# 壹零零点玖壹捌
#
#  2、编写程序，随机生成5个0~10之间不相等的数。
#  num_list = []
#  num = random.randint(0, 10)
#  num_list.append(num)
#  while len(num_list) < 5:
#      num = random.randint(0, 10)
#      for i in num_list:
#          if i == num:
#              tag = 1
#          else:
#              tag = 0
#      if tag == 0:
#          num_list.append(num)
#  print(num_list)
#
#  [10, 6, 2, 9, 1]
#
#  3、随机生成6位的验证码，验证码是小写字母、大写字母、数字三种类型中的一种。【数字0~9;小写字母a~z的ASCII是97~97+25;大写字母A~Z的ASCII是65~65+25】
#  num = [i for i in range(48,58)]
#  s_str = [i for i in range(97, 97 + 26)]
#  m_str = [i for i in range(65, 65 + 26)]
#  list = []
#  list.extend(num)
#  list.extend(s_str)
#  list.extend(m_str)
#  for i in range(0, 6):
#      check = random.choices(list)
#       print(check,end='')
#      print(chr(check[0]),end='')
#
#  b1AQtc
#
#  4、创建一个20以内奇数列表，计算列表中所有数的和。Sum(Range(1,20,2))
# sum = sum(range(1,20,2))
# print(sum)
#  100
#
#  5、输入一个字符串和一个字符，计算字符在字符串的出现的次数。     Count()
# str = input("请输入一字符串:")
# for i in str:
#  print(i, ':', str.count(i))
#
#  请输入一字符串: sdxsaxs
#  s: 3
#  d: 1
#  x: 2
#  s: 3
#  a: 1
#  x: 2
#  s: 3
#
#  6、将下面表格中的数据按成绩从高到低进行排序，输出排序结果。输出结果如下图所示。
#  姓名	成绩
#  吴忱	76
#  杨九莲	99
#  安芸芸	84
#  刘洋	70
#  兰成	89
#  排名 姓名 成绩
#  1  杨九莲	99
#  2  兰成	89
#  3  安芸芸	84
#  4  吴忱	76
#
# data = [
#  {"姓名": "吴忱", "成绩": 76},
#  {"姓名": "杨九莲", "成绩": 99},
#  {"姓名": "安芸芸", "成绩": 84},
#  {"姓名": "刘洋", "成绩": 70},
#  {"姓名": "兰成", "成绩": 89}
# ]
# sorted_data = sorted(data, key=lambda item: item['成绩'], reverse=True)
# print("排名\t姓名\t成绩")
# for index, item in enumerate(sorted_data, start=1):
#  print(f"{index}\t{item['姓名']}\t{item['成绩']}")
#
#
#  7、随机生成1000个由0、1组成的字符串，统计0、1的个数。
# nums=random.choices(range(2),k=1000)
# for i in nums:
#  if i==0:
#      lst1=nums.count(i)
# for j in nums:
#  if j==1:
#      lst2=nums.count(j)
# print(f"0字符在字符串中一共出现了{lst1}次")
# print(f"1字符在字符串中一共出现了{lst2}次")
#
# 0字符在字符串中一共出现了479次
# 1字符在字符串中一共出现了521次
#
#  8、输入5个数，将其分别按从小到大，从大到小的顺序输出。
#  接收用户输入的5个数
# numbers = []
# for i in range(5):
#  num = float(input(f"请输入第{i + 1}个数: "))
#  numbers.append(num)
# # 按从小到大排序
# sorted_asc = sorted(numbers)
# print("从小到大排序:", sorted_asc)
# # 按从大到小排序
# sorted_desc = sorted(numbers, reverse=True)
# print("从大到小排序:", sorted_desc)
#
# 请输入第1个数: 110.23
# 请输入第2个数: 23.89
# 请输入第3个数: 349.678
# 请输入第4个数: 23.101
# 请输入第5个数: 1999.99
# 从小到大排序: [23.101, 23.89, 110.23, 349.678, 1999.99]
# 从大到小排序: [1999.99, 349.678, 110.23, 23.89, 23.101]
#
#  9、有两个集合，集合A为{1,2,3,4,5}，集合B为{4,5,6,7,8}，计算这两个集合的并集|、交集&、差集-和对称差集^。从键盘输入一个数据，判断其是否在集合A或集合B中。
# A={1,2,3,4,5}
# B={4,5,6,7,8}
# print("集合A：{1,2,3,4,5}\n集合B：{4,5,6,7,8}")
# lst1=A|B
# lst2=A&B
# lst3=A-B
# lst4=A^B
# print("这两个集合的并集为：",lst1)
# print("这两个集合的交集为：",lst2)
# print("这两个集合的差集为：",lst3)
# print("这两个集合的对称差集为：",lst4)
# n=int(input("请输入一个数："))
# if n in A and n in B:
#  print(f"输入的数{n}即在集合A也在集合B中")
# elif n in A or n in B:
#  print(f"输入的{n}数在集合A或集合B中")
# else:
#  print(f"输入的数{n}不在集合A和集合B中")
#
#  集合A：{1, 2, 3, 4, 5}
#  集合B：{4, 5, 6, 7, 8}
#  这两个集合的并集为： {1, 2, 3, 4, 5, 6, 7, 8}
#  这两个集合的交集为： {4, 5}
#  这两个集合的差集为： {1, 2, 3}
#  这两个集合的对称差集为： {1, 2, 3, 6, 7, 8}
#  请输入一个数：0
#  输入的数0不在集合A和集合B中
#
#  10、输入一个字符串和一个字符，计算字符在字符串中出现的次数。
# str = input('输入字符串：')
# i= input('输入统计的字符')
# print(i,'在',str,'中出现:',str.count(i),'次。')
#
# 输入字符串：hello world
# 输入统计的字符l
# l 在 hello world  中出现: 3 次。
#
#  11、对zip对象结果进行序列解包，并循环遍历；对enumerate对象结果进行序列解包，并循环遍历。
# lst1=random.choices(range(101),k=10)
# lst2=random.choices(range(50,101),k=10)
# print(f"随机生成10个0~100的列表{lst1}\n随机生成10个50~100的列表{lst2}")
# lst=zip(lst1,lst2)
# for i,j in lst:
#     print("循环遍历:",i,j)
#
# lst3=random.choices(range(100,1001),k=10)
# print("随机生成10个100~1000的列表为：\n",lst3)
# lst4=enumerate(lst3)
# for x,y in lst4:
#     print("解包并循环遍历",x,y)

#
#  12、随机生成20个数字的列表，保留奇数列表。filter
# lst=random.choices(range(101),k=20)
# print("随机生成20个数字的列表为：\n",lst)
# def f(n):
#  return n%2==1
# lst1=filter(f,lst)
# print("其中的奇数列表为：",list(lst1))
# 随机生成20个数字的列表为：
#  [86, 31, 46, 43, 41, 64, 96, 61, 62, 28, 53, 32, 89, 97, 82, 77, 75, 20, 54, 29]
# 其中的奇数列表为： [31, 43, 41, 61, 53, 89, 97, 77, 75, 29]
#
#
#  13、输入一些数字，作为元组的元素，查找最后一个数字在元组中出现多少次？
# tup = input("请输入一些数字：")
# print(f"最后一个元素{tup[-1]}出现次数是{tup.count(tup[-1])}")
# 请输入一些数字：867843697234857435098707887
# 最后一个元素7出现次数是6
#
#  14、输入一些数字，作为元组的元素，在元组中随机确定一个数字，查找这个数字首次出现的位置。
# tup = input("请输入一些数字：")
# n = input("请输入一个数字：")
# print(f"你输入的这个数字{n}在这些数字中首次出现的位置是第{tup.index(n)}个位置")
#
# 请输入一些数字：5376560874643
# 请输入一个数字：7
# 你输入的这个数字7在这些数字中首次出现的位置是第2个位置
#
#  15、随机生成10个小写字母，随机生成10个大写字母。
# lst = random.sample(string.ascii_lowercase, 10)
# print("随机生成的小写字母:", lst)
# LST= random.sample(string.ascii_uppercase, 10)
# print("随机生成的大写字母:", LST)
#
# 随机生成的小写字母: ['z', 'v', 'x', 'u', 'e', 'r', 'n', 'a', 'm', 't']
# 随机生成的大写字母: ['J', 'T', 'K', 'N', 'W', 'G', 'M', 'Y', 'O', 'U']
#
#  16、创建一个20以内奇数列表，计算列表中所有数的和。
# lst=random.choices(range(21),k=30)
# print("随机生成30个20以内的数字列表为：",lst)
# lst1=[]
# for i in lst:
#  if i%2==1:
#      lst1.append(i)
# print("所有数的和为：",sum(lst1))
#
#  17、设计一个函数，接受一组数据，分别计算最大值和最小值。
# n=input("请输入一些数：")
# print("这些数中最大的为：",max(n))
# print("这些数中最小的为：",min(n))
#
#  18、统计一篇英文文章的词频。http://en.people.cn/
# import requests
# from collections import Counter
# import re
# url = 'http://en.people.cn/'
# response = requests.get(url)
# text = response.text
# text = text.lower()
# text = re.sub(r'[^\w\s]', '', text)
# words = text.split()
# stopwords = set(['the', 'and', 'a', 'an', 'in', 'on', 'is', 'are', 'was', 'were', 'am', 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her', 'us', 'them', 'my', 'your', 'his', 'her', 'its', 'our', 'their', 'mine', 'yours', 'his', 'hers', 'ours', 'theirs'])
# words = [word for word in words if word not in stopwords]
# word_counts = Counter(words)
# for word, count in word_counts.most_common():
#  print(f"{word}: {count}")
#
#  19、统计一篇中文文章的词频。http://www.xuexi.cn     jieba库
#  21、随机生成1000个由大小写英文字母构成的字符串，分别统计每个字符的个数。
# import random
# from collections import Counter
# strings = [''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', k=10)) for _ in range(1000)]
# char_counts = Counter(''.join(strings))
# for char, count in char_counts.items():
#  print(f"{char}: {count},",end='')
#
#
#  22、已知列表data中有若干字符串，要求编写程序，对data中的字符串进行过滤，只输出重复字符不超过一半的字符串。
# from collections import Counter
# data = ['hello', 'world', 'python', 'programming', 'code', 'example', 'test', 'hello world']
# def f(data):
#  lst= []
#  for i in data:
#      char_counts = Counter(i)
#      half_length = len(i) // 2
#      excess_chars = sum(1 for count in char_counts.values() if count > half_length)
#      if excess_chars <= half_length:
#          lst.append(i)
#  return lst
# lst_data = f(data)
# for s in lst_data:
#  print(s)
#  24、编写程序，生成包含1000个[0,100]的随机整数，并统计每个元素的出现次数。
# nums=random.choices(range(101),k=1000)
# print("生成1000个[0,100]的随机整数:",nums)
# dct={i:0 for i in range(101)}
# for i in nums:
#  dct[i]+=1
# for num,count in dct.items():
#  print(f"数字{num}:        出现      {count}次")
# 数字0:        出现      11次
# 数字1:        出现      18次
# 数字2:        出现      6次
# 数字3:        出现      9次
# 数字4:        出现      13次
# ......
#
#
#  25、编写程序，用户输入一个列表和2个整数作为下标，然后输出列表中介于2个下标闭区间之间的元素组成的子列表。例如用户输入[1,2,3,4,5,6]和2，5，程序输出[3,4,5,6]。
# lst= eval(input("请输入一个列表："))
# start_index = int(input("请输入起始下标："))
# end_index = int(input("请输入结束下标："))
# if start_index < 0 or end_index < 0 or start_index >= len(lst) or end_index >= len(lst) or start_index > end_index:
#     print("无效的下标！")
# else:
#     print("介于两个下标之间的子列表为：",lst[start_index:end_index+1])
# 请输入一个列表：1212,21,2,12,12,2,2,12,12,1,2,33
# 请输入起始下标：2
# 请输入结束下标：7
# 介于两个下标之间的子列表为： (2, 12, 12, 2, 2, 12)
#
#
#  26、设计一个字典，并编写程序，用户输入内容作为“键”，然后输出字典对应的“值”，如果用户输入的“键”不存在，则输出“您输入的键不存在！”
# dct = { "苹果": "apple", "香蕉": "banana","橙子": "orange","葡萄": "grape","西瓜": "watermelon"}
# name= input("请输入一个水果名称：")
# if name in dct:
#     print(dct[name])
# else:
#     print("您输入的键不存在！")
#
#  27、编写程序，生成包含20个随机数的列表，然后将前10个元素升序排列，后10个元素降序排列，并输出结果。
# nums=random.choices(range(101),k=20)
# print("生成20个随机整数:",nums)
# lst1=nums[0:10]
# lst2=nums[10:21]
# print(f"将前10个元素升序排列{sorted(lst1)}\n将后10个元素降序排列{sorted(lst2,reverse=True)}")
# 生成20个随机整数: [22, 48, 60, 74, 2, 49, 15, 67, 10, 97, 19, 66, 37, 75, 25, 8, 22, 32, 16, 50]
# 将前10个元素升序排列[2, 10, 15, 22, 48, 49, 60, 67, 74, 97]
# 将后10个元素降序排列[75, 66, 50, 37, 32, 25, 22, 19, 16, 8]
#
#
#  28、编写程序，输入一个字符串，输出其中出现次数最多的字符及其出现次数。
# lst_str = input("请输入一串字符串：")
# dct = {}
# for char in lst_str:
#     if char in dct:
#         dct[char] += 1
#     else:
#         dct[char] = 1
# max_char = max(dct, key=dct.get)
# max_count = dct[max_char]
# print(f"出现次数最多的字符是{max_char}    出现{max_count}次")
#
#  29、使用字典推导式生成字典，字典的键是所有的英文字母，值是对应的ASCII码。
#  d1={}
#  for i in range(26):
#         d1[chr(i+65)]=i+65
#  for i in range(26):
#         d1[chr(i+97)]=i+97
#  print(d1)
#
#  {'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69, 'F': 70, 'G': 71, 'H': 72, 'I': 73, 'J': 74, 'K': 75, 'L': 76, 'M': 77, 'N': 78, 'O': 79, 'P': 80, 'Q': 81, 'R': 82, 'S': 83, 'T': 84, 'U': 85, 'V': 86, 'W': 87, 'X': 88, 'Y': 89, 'Z': 90, 'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101, 'f': 102, 'g': 103, 'h': 104, 'i': 105, 'j': 106, 'k': 107, 'l': 108, 'm': 109, 'n': 110, 'o': 111, 'p': 112, 'q': 113, 'r': 114, 's': 115, 't': 116, 'u': 117, 'v': 118, 'w': 119, 'x': 120, 'y': 121, 'z': 122}
#
#  30、生成从某个字母开始的n个元素构成的字典。如l开始的5个。
#  star = input("请输入开始的字母：")
#  n = int(input("几个元素"))
#  star_ascll = ord(star)
#  d1={}
#  print(star_ascll)
#  for i in range(n):
#         d1[chr(star_ascll)]=0
#         star_ascll+=1
#  print(d1)
#
#  请输入开始的字母：t
#  几个元素7
#  116
#  {'t': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'y': 0, 'z': 0}
#
